import java.util.Scanner;

public class TestDemo {
    //递归
    public static void main1(String[] args) {
        //1 用递归求阶乘
        System.out.println(fun(5));

        //2 递归求n的和
        System.out.println(sumAdd(10));
    }
    public static int fun(int n){
        if(n == 1){
            return 1;
        }else {
            return n * fun(n - 1);
        }
    }
    public static int sumAdd(int n){
        if(n == 1){
            return 1;
        }else {
            return n + sumAdd(n - 1);
        }
    }

    public static void main2(String[] args) {
        //3 递归打印数字的每一位：按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) （递归）
        printNum(123);

        //4 返回的数字之和：写一个递归方法，输入一个非负整数，返回组成它的数字之和
        System.out.println(sumEveryOne(123));;
    }
    public static int sumEveryOne(int n){
        if(n < 10){
            return n;
        }else {
            return sumEveryOne(n / 10) + n % 10;
        }
    }
    public static void printNum(int n){
        if(n < 10){
            System.out.print(n + " ");;
        }else {
            printNum(n / 10);
            System.out.print(n % 10 + " ");
        }
    }

    public static void main3(String[] args) {
        System.out.println(fib(2));
        System.out.println(fib(10));

        System.out.println(fib2(2));
        System.out.println(fib2(10));
    }
    public static int fib(int n){
        // 3 递归求斐波那契数列的第 N 项
        if(n == 1 || n == 2){
            return 1;
        }else {
            return fib(n - 1) + fib(n - 2);
        }
    }
    public static int fib2(int n){
     //循环（迭代）求斐波那契数列的第 N 项
     if(n == 1 || n == 2){
         return 1;
     }else {
         int f1 = 1;
         int f2 = 1;
         int sum = 0;
         for(int i = 3; i <= n; i++){
             sum = f1 + f2;
             f1 = f2;
             f2 = sum;
         }
         return sum;
     }
    }

    public static void main4(String[] args) {
    // 4 求最大值方法的重载: 在同一个类中定义多个方法：要求不仅可以求2个整数的最大值，还可以求3个小数的最大值
        System.out.println(max(1,2));
        System.out.println(max(1.5,4.5,9.0));
    }
    public static int max(int x, int y){
        return x > y ? x : y;
    }
    public static double max(double a, double b){
        return a > b ? a : b;
    }
    public static double max(double a, double b, double c){
        return max(max(a, b), c);
    }

    public static void main5(String[] args) {
        // 5 求和的重载：在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。
        System.out.println(sum(1,2));
        System.out.println(sum(1.0,2.0,3.0));
    }
    public static int sum(int a, int b){
        return (a + b);
    }
    public static double sum(double a, double b, double c){
        return (a + b + c);
    }

    // 6 青蛙跳台阶问题
    public static void main6(String[] args) {
        System.out.println(jump(4));
        System.out.println(jump2(4));
    }
    // 6.1 递归实现
    public static int jump(int n){
        if(n == 1 || n == 2){
            return n;
        }else {
            return jump(n - 1) + jump(n - 2);
        }
    }
    // 6.2 非递归实现
    public static int jump2(int n){
        if (n == 1 || n == 2){
            return n;
        }else {
            int n1 = 1;
            int n2 = 2;
            int nx = 0;
            for (int i = 3; i <= n; i++){
                nx = n1 + n2;
                n1 = n2;
                n2 = nx;
            }
            return nx;
        }
    }
}
